"""
PPT设计基因和视觉指导相关提示词
包含所有用于设计分析和视觉指导的提示词模板
"""

from typing import Dict, Any
import logging

logger = logging.getLogger(__name__)


def _is_image_service_enabled() -> bool:
    """检查图片服务是否启用和可用"""
    try:
        # 尝试获取图片服务实例
        from ..service_instances import get_ppt_service
        ppt_service = get_ppt_service()

        # 检查图片服务是否存在且已初始化
        if not ppt_service.image_service:
            return False

        # 检查图片服务是否已初始化
        if not ppt_service.image_service.initialized:
            return False

        # 检查是否有可用的提供者
        from ..image.providers.base import provider_registry

        # 检查是否有AI生成提供者
        generation_providers = provider_registry.get_generation_providers(enabled_only=True)

        # 检查是否有网络搜索提供者
        search_providers = provider_registry.get_search_providers(enabled_only=True)

        # 检查是否有本地存储提供者（总是可用）
        storage_providers = provider_registry.get_storage_providers(enabled_only=True)

        # 如果有任何可用的提供者（AI生成、网络搜索或本地存储），则认为服务可用
        has_providers = len(generation_providers) > 0 or len(search_providers) > 0 or len(storage_providers) > 0

        logger.debug(f"Image service status: initialized={ppt_service.image_service.initialized}, "
                    f"generation_providers={len(generation_providers)}, "
                    f"search_providers={len(search_providers)}, "
                    f"storage_providers={len(storage_providers)}")

        return has_providers

    except Exception as e:
        logger.debug(f"Failed to check image service status: {e}")
        return False


class DesignPrompts:
    """PPT设计基因和视觉指导相关的提示词集合"""
    
    @staticmethod
    def get_style_gene_extraction_prompt(template_code: str) -> str:
        """获取设计基因提取提示词"""
        return f"""作为专业的UI/UX设计师，请分析以下HTML模板代码，提取其核心设计基因。

**模板代码：**
```html
{template_code}
```

请从以下维度分析并提取设计基因：

1. **色彩系统**：主色调、辅助色、背景色、文字色等
2. **字体系统**：字体族、字号层级、字重搭配等
3. **布局结构**：页面布局、间距规律、对齐方式等
4. **视觉元素**：边框样式、阴影效果、圆角设计等
5. **交互效果**：动画效果、悬停状态、过渡效果等
6. **组件风格**：按钮样式、卡片设计、图标风格等

请以结构化的方式输出设计基因，包含具体的CSS属性值和设计规律，以便后续页面能够保持一致的视觉风格。

输出格式：
- 每个维度用明确的标题分隔
- 提供具体的CSS属性和数值
- 说明设计规律和应用场景
- 突出关键的视觉特征"""

    @staticmethod
    def get_style_genes_extraction_prompt(template_code: str) -> str:
        """向后兼容的设计基因提取提示词（别名）"""
        return DesignPrompts.get_style_gene_extraction_prompt(template_code)

    @staticmethod
    def get_unified_design_guide_prompt(slide_data: Dict[str, Any], page_number: int, total_pages: int) -> str:
        """获取统一设计指导提示词"""

        # 处理图片信息 - 只有在图片服务启用且有图片信息时才包含
        images_context = ""
        if _is_image_service_enabled() and 'images_summary' in slide_data:
            images_context = f"""


**图片设计指导要求：**
- 请充分考虑这些图片资源在设计中的运用
- 根据图片的用途、内容描述和尺寸信息提供具体的布局建议
- 考虑图片的实际尺寸（宽度x高度）来优化布局和比例
- 根据图片文件大小和格式选择合适的显示方式
- 确保图片与页面内容的协调性和视觉平衡
- 提供图片样式和位置的优化建议
"""

        return f"""作为资深的PPT设计师，请为以下幻灯片生成全面的创意设计指导，包含创意变化指导和内容驱动的设计建议：

**完整幻灯片数据：**
{slide_data}

**页面位置：**第{page_number}页（共{total_pages}页）

{images_context}

请从以下角度生成统一的设计指导：

**A. 页面定位与创意策略**：
- 分析该页面在整体PPT中的作用和重要性
- 确定页面的核心信息传达目标
- 提出符合页面定位的创意设计方向

**B. 视觉层级与布局建议**：
- 根据内容重要性设计视觉层级
- 提供具体的布局方案和元素排列建议
- 考虑信息密度和视觉平衡

**C. 色彩与风格应用**：
- 基于内容特点选择合适的色彩方案
- 提供具体的色彩搭配建议
- 确保与整体PPT风格的一致性

**D. 交互与动效建议**：
- 根据页面类型提供合适的交互效果
- 建议页面切换和元素动画
- 增强用户体验和视觉吸引力

**E. 内容优化建议**：
- 分析内容要点的表达方式
- 提供信息可视化建议
- 优化文字表达和信息结构

请提供具体、可操作的设计指导，帮助生成高质量的PPT页面。"""

    @staticmethod
    def get_creative_variation_prompt(slide_data: Dict[str, Any], page_number: int, total_pages: int) -> str:
        """获取创意变化指导提示词"""
        return f"""作为创意设计专家，请为以下幻灯片提供创意变化指导：

**幻灯片数据：**
{slide_data}

**页面位置：**第{page_number}页（共{total_pages}页）

请从以下角度提供创意指导：

**1. 视觉创意方向**：
- 根据页面内容特点，提出独特的视觉表现方式
- 建议创新的布局形式和元素组合
- 提供差异化的设计思路

**2. 交互创意建议**：
- 设计有趣的页面交互效果
- 提供动态元素的创意应用
- 增强用户参与感和体验感

**3. 内容呈现创新**：
- 优化信息的可视化表达
- 提供创意的内容组织方式
- 增强信息的传达效果

**4. 风格变化控制**：
- 在保持整体一致性的前提下，提供适度的风格变化
- 确保创意不影响信息传达的清晰度
- 平衡创新性与实用性

请提供具体的创意实施建议。"""

    @staticmethod
    def get_content_driven_design_prompt(slide_data: Dict[str, Any], page_number: int, total_pages: int) -> str:
        """获取内容驱动设计建议提示词"""
        return f"""作为内容驱动设计专家，请为以下幻灯片提供基于内容的设计建议：

**幻灯片数据：**
{slide_data}

**页面位置：**第{page_number}页（共{total_pages}页）

请从以下角度提供设计建议：

**1. 内容分析与层级**：
- 分析页面内容的重要性层级
- 确定主要信息和次要信息
- 提供信息优先级排序建议

**2. 视觉表达策略**：
- 根据内容类型选择最佳的视觉表达方式
- 提供图表、图像、文字的组合建议
- 优化信息的可读性和理解性

**3. 布局优化方案**：
- 基于内容特点设计最佳布局
- 确保信息流的逻辑性和连贯性
- 提供空间利用的优化建议

**4. 用户体验考虑**：
- 从目标受众角度优化设计
- 确保信息传达的有效性
- 提高用户的理解和记忆效果

请提供具体的设计实施方案。"""

    @staticmethod
    def get_creative_template_context_prompt(slide_data: Dict[str, Any], template_html: str,
                                           slide_title: str, slide_type: str, page_number: int,
                                           total_pages: int, context_info: str, style_genes: str,
                                           unified_design_guide: str, project_topic: str,
                                           project_type: str, project_audience: str, project_style: str) -> str:
        """获取创意模板上下文提示词"""

        # 处理图片信息 - 只有在图片服务启用且有图片信息时才包含
        images_info = ""
        if _is_image_service_enabled() and 'images_summary' in slide_data:
            images_info = f"""


**图片使用要求：**
- 请在HTML中合理使用这些图片资源
- 图片地址已经是绝对地址，可以直接使用
- 根据图片用途、内容描述和实际尺寸选择合适的位置和样式
- 充分利用图片的尺寸信息（宽度x高度）来优化布局设计
- 根据图片文件大小和格式选择合适的显示策略
- 确保图片与页面内容和设计风格协调
- 可以使用CSS对图片进行适当的样式调整（大小、位置、边框等）
"""

        return f"""你是一位富有创意的设计师，需要为第{page_number}页创建一个既保持风格一致性又充满创意的PPT页面。

**严格内容约束**：
- 页面标题：{slide_title}
- 页面类型：{slide_type}
- 总页数：{total_pages}

**完整页面数据参考**：
{slide_data}

{images_info}

**风格模板（页眉和页脚必须完全保持原样）**：
```html
{template_html}
```

**⚠️ 严格保留参考模板的页眉和页脚样式要求 ⚠️**

**绝对不允许修改的区域（除首页、目录页和尾页外）**：
1. **页眉部分**：包括标题位置、字体、颜色、大小、布局等必须与参考模板中所示完全一致
2. **页脚部分**：包括页码、位置、字体、颜色、大小和任何页脚元素必须与参考模板中所示完全一致
3. **模板框架**：页眉和页脚的整体框架结构必须保持完全不变

**允许修改的区域**：
- 仅限页眉和页脚之间的主要内容区域
- 主要内容区域内的布局、颜色、字体可以根据内容需要进行调整
- 主要内容区域内可以添加图片、图表、装饰元素等

**重要说明**：
- 无论生成的幻灯片内容或设计变体如何，页眉和页脚都必须保留原样
- AI生成过程中不应对页眉和页脚模板区域进行任何样式修改
- "完全保持原样"意味着这些区域的所有视觉属性都不能改变

{context_info}

**核心设计原则**

1.  **固定画布**：所有设计都必须在`1280x720`像素的固定尺寸画布内完成。最终页面应水平和垂直居中显示。
2.  **页面专业度**：核心目标是让页面无论内容多少，都显得**专业且设计感强**。
3.  **严格的模板框架保持**：
   - **页眉区域**：标题的位置、字体族、字体大小、字体颜色、字体粗细、对齐方式等必须与参考模板完全一致
   - **页脚区域**：页码的位置、字体族、字体大小、字体颜色、字体粗细、对齐方式等必须与参考模板完全一致
   - **框架结构**：页眉和页脚的容器尺寸、边距、内边距等布局属性必须保持不变
   - **视觉统一**：确保所有页面的页眉和页脚在视觉上完全一致，建立统一的品牌框架

**动态内容自适应布局**

请根据内容的数量，智能地选择最佳布局和字体策略

**视觉呈现与组件运用**

*   **创意优先**：不要局限于简单的文本列表。请根据内容特点，**自由选择并组合最合适的视觉组件**
*   **视觉层次**：通过大小、颜色和布局的变化，建立清晰的视觉焦点和信息层次。

**设计指导理念**

*   **自然流畅的视觉体验**：页面内容应自然适应可用空间，营造舒适的阅读体验
*   **文字清晰可读**：所有文字内容都应该清晰可见，合理分布在可视区域内
*   **内容完整呈现**：确保所有元素都在可视区域内，避免装饰元素遮挡主要内容

**💡 自适应设计哲学**

设计应该像水一样，能够根据容器自动调整形态，优雅地适应不同内容量：

1. **内容驱动的空间利用**：
   - 当内容较少时，充分利用空间增强视觉表现力
   - 当内容丰富时，智能分配空间确保信息完整展示
   - 让每个元素都找到最适合的空间位置

2. **灵活的布局策略**：
   - 优先考虑信息的清晰传达，其次考虑视觉美感
   - 根据内容特点选择合适的布局方式（垂直、水平、网格等）
   - 空间不足时，可以调整字体、间距或布局结构

3. **智能的内容适配**：
   - 文字、图像、图表等元素应该协调共存
   - 重要信息使用视觉层次突出，次要信息合理收敛
   - 保持整体设计的一致性和连贯性

4. **用户体验优先**：
   - 避免任何阻断阅读体验的设计元素
   - 确保内容易于扫描和理解
   - 营造舒适的信息浏览氛围

5. **灵活的视觉层次**：
   - 根据内容重要性调整字体大小和视觉权重
   - 使用适当的留白增强内容可读性
   - 让视觉焦点自然流向核心信息

6. **内容完整呈现**：
   - 确保所有文字、图像等元素都在可视区域内
   - 注意元素的层级关系，避免后面的元素遮挡前面的内容
   - 当使用装饰元素、背景、边框等时，确保它们不会影响主要内容
   - 建议重要内容使用较高的层级，避免被装饰元素覆盖

**设计目标**：创造一个既美观又实用的内容展示空间，让每个元素都发挥最佳效果。

**核心设计基因（必须保持）**：
{style_genes}

**统一创意设计指导**：
{unified_design_guide}

**项目背景**：
- 主题：{project_topic}
- 类型：{project_type}
- 目标受众：{project_audience}
- PPT风格：{project_style}

**设计哲学**：
1. **一致性原则** - 严格遵循核心设计基因，确保品牌识别度和视觉统一性
2. **创新性原则** - 仅在主要内容区域内进行创新，避免千篇一律但不破坏模板框架
3. **内容适配原则** - 让设计服务于内容，但必须在模板框架约束内进行
4. **用户体验原则** - 优化信息传达效率和视觉舒适度，同时保持模板的专业性

**创意要求**：
- **创意范围**：仅在主要内容区域内进行创意设计，在保持核心设计基因的前提下创造独特的布局结构
- 根据内容特点选择最佳的信息展示方式，但不能影响页眉页脚的原有样式
- 使用创新的视觉元素增强表达效果，但必须限制在主要内容区域内
- 确保每一页都有独特的视觉亮点，同时保持页眉页脚的统一性
- **空间利用创意要求**：
  * 设计时必须考虑内容如何填满整个可用空间
  * 使用flex布局的flex-grow属性让内容区域自动扩展
  * 对于内容较少的页面，通过增大字体、图标、间距等方式充分利用空间
  * 避免所有内容都集中在页面上半部分，要有意识地分布到整个页面
  * 底部区域也要合理利用，可以放置装饰元素或次要信息

**富文本支持**：
- 支持数学公式（使用MathJax）、代码高亮（使用Prism.js）、图表（使用Chart.js）等富文本元素
- 根据内容需要自动添加相应的库和样式

**技术规范**：
- 生成完整的HTML页面（包含<!DOCTYPE html>、head、body）
- 使用Tailwind CSS或内联CSS，确保美观的设计
- 页面尺寸自适应：html {{ height: 100%; display: flex; align-items: center; justify-content: center; }} body {{ width: 100%; height: 100%; position: relative; overflow: hidden; }}
- 支持使用Chart.js和Font Awesome库
- 页码显示为：{page_number}/{total_pages}
- **页眉页脚风格延续**：
  * 页眉区域：延续参考模板的标题风格和视觉特征
  * 页脚区域：保持页码和装饰元素的一致性
- **空间利用建议**：
  * 合理分配主内容区域的空间，避免浪费
  * 根据内容特点动态调整视觉元素
  * 确保所有内容在可视区域内自然展示
  * 保持各元素之间的协调平衡
- 图表元素应完整展示，充分利用可用空间

**重要输出格式要求**：
- 必须使用markdown代码块格式返回HTML代码
- 格式：```html\\n[HTML代码]\\n```
- HTML代码必须以<!DOCTYPE html>开始，以</html>结束
- 不要在代码块前后添加任何解释文字
"""

    @staticmethod
    def get_single_slide_html_prompt(slide_data: Dict[str, Any], confirmed_requirements: Dict[str, Any],
                                   page_number: int, total_pages: int, context_info: str,
                                   style_genes: str, unified_design_guide: str, template_html: str) -> str:
        """获取单页HTML生成提示词"""

        # 处理图片信息 - 只有在图片服务启用且有图片信息时才包含
        images_info = ""
        if _is_image_service_enabled() and 'images_summary' in slide_data:
            images_info = f"""

**图片使用要求：**
- 请在HTML中合理使用这些图片资源
- 图片地址已经是绝对地址，可以直接使用
- 根据图片用途、内容描述和实际尺寸选择合适的位置和样式
- 充分利用图片的尺寸信息（宽度x高度）来优化布局设计
- 根据图片文件大小和格式选择合适的显示策略
- 确保图片与页面内容和设计风格协调
- 可以使用CSS对图片进行适当的样式调整（大小、位置、边框等）
"""

        return f"""
根据项目信息，为第{page_number}页生成完整的HTML代码。

项目信息：
- 主题：{confirmed_requirements.get('topic', '')}
- 目标受众：{confirmed_requirements.get('target_audience', '')}
- 其他说明：{confirmed_requirements.get('description', '无')}

当前页面信息：
{slide_data}

{images_info}

**风格模板（页眉和页脚必须完全保持原样）**：
```html
{template_html}
```

**⚠️ 严格保留参考模板的页眉和页脚样式要求 ⚠️**

**绝对不允许修改的区域（除首页、目录页和尾页外）**：
1. **页眉部分**：包括标题位置、字体、颜色、大小、布局等必须与参考模板中所示完全一致
2. **页脚部分**：包括页码、位置、字体、颜色、大小和任何页脚元素必须与参考模板中所示完全一致
3. **模板框架**：页眉和页脚的整体框架结构必须保持完全不变

**允许修改的区域**：
- 仅限页眉和页脚之间的主要内容区域
- 主要内容区域内的布局、颜色、字体可以根据内容需要进行调整
- 主要内容区域内可以添加图片、图表、装饰元素等

**重要说明**：
- 无论生成的幻灯片内容或设计变体如何，页眉和页脚都必须保留原样
- AI生成过程中不应对页眉和页脚模板区域进行任何样式修改
- "完全保持原样"意味着这些区域的所有视觉属性都不能改变

**核心设计原则**

1.  **固定画布**：所有设计都必须在`1280x720`像素的固定尺寸画布内完成。最终页面应水平和垂直居中显示。
2.  **页面专业度**：核心目标是让页面无论内容多少，都显得**专业且设计感强**。
3.  **严格的模板框架保持**：
   - **页眉区域**：标题的位置、字体族、字体大小、字体颜色、字体粗细、对齐方式等必须与参考模板完全一致
   - **页脚区域**：页码的位置、字体族、字体大小、字体颜色、字体粗细、对齐方式等必须与参考模板完全一致
   - **框架结构**：页眉和页脚的容器尺寸、边距、内边距等布局属性必须保持不变
   - **视觉统一**：确保所有页面的页眉和页脚在视觉上完全一致，建立统一的品牌框架

**动态内容自适应布局**

请根据内容的数量，智能地选择最佳布局和字体策略。

**视觉呈现与组件运用**

*   **创意优先**：不要局限于简单的文本列表。请根据内容特点，**自由选择并组合最合适的视觉组件**
*   **视觉层次**：通过大小、颜色和布局的变化，建立清晰的视觉焦点和信息层次。

**设计指导理念**

*   **自然流畅的视觉体验**：页面内容应自然适应可用空间，营造舒适的阅读体验
*   **文字清晰可读**：所有文字内容都应该清晰可见，合理分布在可视区域内
*   **内容完整呈现**：确保所有元素都在可视区域内，避免装饰元素遮挡主要内容
**设计平衡要求（一致性与创新并重）**：
1. 使用16:9的响应式PPT尺寸，适配不同屏幕大小
2. **必须保持一致的核心元素**：
   - 遵循提供的设计风格模板中的核心约束
   - 保持主色调和字体系统的统一
   - 维持整体视觉品牌的连贯性
3. **鼓励创新的设计空间**：
   - 根据内容特点创新布局结构
   - 灵活运用视觉元素增强表达效果
   - 适度融入当前设计趋势
   - 优化信息层次和用户体验

**技术规范**：
- 生成完整的HTML页面（包含<!DOCTYPE html>、head、body，不包含style标签）
- 使用Tailwind CSS或内联CSS，确保美观的设计
- 使用16:9响应式设计，适配不同屏幕尺寸
- 使用CSS的aspect-ratio属性保持16:9比例
- 使用clamp()函数实现响应式字体大小
- 使用百分比和vw/vh单位实现响应式布局
- 内容布局清晰，重点突出
- 确保文字清晰可读，颜色搭配协调



{f'''
**图片集成指导**：
- 图片资源: {slide_data.get('image_url', '无')}
- 如果有图片资源，请必须合理地将图片融入页面设计中：
  * 根据图片的实际尺寸（宽度x高度）优化布局和比例设计
  * 考虑图片文件大小，对大文件图片进行适当的压缩显示
  * 根据图片格式（PNG/JPEG/WebP等）选择合适的显示方式
  * 图片大小和位置应与页面布局协调，不影响文字阅读
  * 可以作为背景图、装饰图或内容配图等各种方式使用
  * 确保图片不会导致页面内容溢出或布局混乱
  * 图片应使用响应式设计，适配不同屏幕尺寸

''' if _is_image_service_enabled() else ''}

**富文本支持**：
- 支持数学公式（使用MathJax）、代码高亮（使用Prism.js）、图表（使用Chart.js）等富文本元素
- 根据内容需要自动添加相应的库和样式

**严格的页面尺寸和高度控制**：
- **页面尺寸**：html {{ height: 100%; display: flex; align-items: center; justify-content: center; }} body {{ width: 100%; height: 100%; position: relative; overflow: hidden; }}
- **滚动条禁止**：严禁页面、body或任何容器出现纵向或横向滚动条，必须通过调整布局和内容使其在可视区域内完整呈现
- **内容高度分配**：
  * **页眉区域**：标题的HTML结构、CSS样式、字体族、字体大小、字体颜色、字体粗细、位置、对齐方式等必须与参考模板完全一致，不允许任何修改
  * **页脚区域**：页码的HTML结构、CSS样式、字体族、字体大小、字体颜色、字体粗细、位置、对齐方式等必须与参考模板完全一致，不允许任何修改
  * **主内容区域**：自适应高度（充分利用可用空间，根据页眉页脚和内容动态调整）- 这是唯一允许修改的区域
  * 避免页面内容超出页面底部或顶部
  * 避免页面内容超出页面左右两侧
  * 避免页面内容被遮挡
- **空间充分利用原则**：
  * **内容自适应扩展**：根据内容数量和类型，动态调整各区域高度
  * **避免大量留白**：合理分配空间，避免底部出现过多空余区域

**核心设计基因（必须保持）**：
{style_genes}

**统一创意设计指导**：
{unified_design_guide}

**重要输出格式要求：**
- 必须使用markdown代码块格式返回HTML代码
- 格式：```html\\n[HTML代码]\\n```
- HTML代码必须以<!DOCTYPE html>开始，以</html>结束
- 不要在代码块前后添加任何解释文字
- 确保代码块标记正确且完整
- 严格遵循上述风格要求生成HTML页面
- **页眉页脚保持原样**：生成的HTML中页眉和页脚部分必须与参考模板完全一致，不允许任何修改
"""

    @staticmethod
    def get_slide_context_prompt(page_number: int, total_pages: int) -> str:
        """获取幻灯片上下文提示词（特殊页面设计要求）"""
        context_parts = []

        if page_number == 1 or page_number == total_pages:
            context_parts.append("**🌟 特殊页面设计要求 🌟**")

            if page_number == 1:
                context_parts.extend([
                    "这是首页，需要在保持原模板风格基础上创造强烈的第一印象。设计原则：",
                    "- **风格一致性**：严格遵循原模板的设计风格、色彩体系、字体选择和布局特征",
                    "- **主题呼应**：确保首页设计与演示主题高度契合，体现专业性和主题相关性",
                    "- **视觉层次**：在原模板框架内运用对比、大小、颜色等手段突出主题标题",
                    "- **背景处理**：基于原模板的背景风格进行适度增强，可考虑渐变、纹理等元素",
                    "- **标题强化**：在保持原模板字体风格的基础上，通过大小、颜色、位置等方式增强表现力",
                    "- **装饰协调**：使用与原模板风格一致的装饰元素，丰富视觉层次但不破坏整体和谐",
                    "- **色彩延续**：严格使用原模板的主色调体系，可适度增加饱和度或亮度来增强吸引力",
                    "- **品牌统一**：确保首页设计与整体演示保持品牌和视觉的统一性"
                ])
            elif page_number == total_pages:
                context_parts.extend([
                    "这是结尾页，需要在保持原模板风格基础上营造完整的收尾感。设计原则：",
                    "- **风格延续**：严格保持与原模板和首页一致的设计风格、色彩和字体体系",
                    "- **主题收尾**：确保结尾页设计与演示主题形成完整呼应，体现主题的完整性",
                    "- **视觉呼应**：与首页和中间页面形成视觉连贯性，保持整体演示的统一感",
                    "- **重点突出**：在原模板框架内突出核心总结信息，确保关键信息得到强调",
                    "- **背景协调**：基于原模板背景风格进行适度处理，营造收尾感但不破坏整体风格",
                    "- **布局平衡**：遵循原模板的布局原则，通过留白和元素分布增强页面的完整感",
                    "- **色彩统一**：严格使用原模板的色彩体系，可适度调整明度来营造收尾氛围",
                    "- **品牌闭环**：确保结尾页与整体演示形成完整的品牌和视觉闭环"
                ])

            context_parts.append("")

        return "\\n".join(context_parts) if context_parts else ""
